www.gusucode.com > VC++ Firewall防火墙源代码 > VC++ Firewall防火墙源代码/Firewall防火墙/Global.cpp
//Download by http://www.NewXing.com #include "stdafx.h" #include "winsock2.h" #include "global.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif CDataConvert::CDataConvert() { m_CurIp=0; ZeroMemory(m_cCurIp,24); // ZeroMemory(&m_alllinechar,sizeof(struct AllLineChar)); m_alllinechar.CurHostNum=0; } CDataConvert::~CDataConvert() { while(!m_ptrlistAllowIp.IsEmpty()) { struct IpaddrRange *IpRange=(struct IpaddrRange *)m_ptrlistAllowIp.RemoveHead(); delete IpRange; } while(!m_ptrlistRejectIp.IsEmpty()) { struct IpaddrRange *IpRange=(struct IpaddrRange *)m_ptrlistRejectIp.RemoveHead(); delete IpRange; } //先删除m_ptrlistHostPort里面的struct PortList的pPortList所指向的内容 while(!m_ptrlistUlong.IsEmpty()) { ULONG *LON=(ULONG*)m_ptrlistUlong.RemoveHead(); delete LON; } while(!m_ptrlistIcmp.IsEmpty()) { struct IcmpList *icmprange=(struct IcmpList *)m_ptrlistIcmp.RemoveHead(); delete icmprange; } while(!m_ptrlistIcmpOut.IsEmpty()) { struct IcmpList *icmprange=(struct IcmpList *)m_ptrlistIcmpOut.RemoveHead(); delete icmprange; } while(!m_ptrlistPort.IsEmpty()) { struct PortList *portlist=(struct PortList *)m_ptrlistPort.RemoveHead(); delete portlist; } //后删除主结构 while(!m_ptrlistHostPort.IsEmpty()) { struct HostList *phostlist=(struct HostList *)m_ptrlistHostPort.RemoveHead(); delete phostlist; } while(!m_listInHttp.IsEmpty()) { struct IpaddrRange *IpRange=(struct IpaddrRange *)m_listInHttp.RemoveHead(); delete IpRange; } while(!m_listOutHttp.IsEmpty()) { struct IpaddrRange *IpRange=(struct IpaddrRange *)m_listOutHttp.RemoveHead(); delete IpRange; } //delete []natcfg->StaticTable.item; } //将用户的需要回显的数据还要以字符形式保存,便于现示 //调用SetHostIp后,不能调用SaveChar //仅对CEdit型EDIT控件调用该函数 //对CString型EDIT控件直接付值 //主机ip的存取在SetHostIp()函数中直接进行了付值 VOID CDataConvert::SaveChar(CEdit &edit,BOOL ishostCfg,UCHAR type) { int Lines=edit.GetLineCount(); char tempchar[20]; CString csPort; int pos; pos=m_alllinechar.CurHostNum; //考虑修改的情况 if(ishostCfg) { for(int ii=0;ii<m_alllinechar.CurHostNum;ii++) { if(strcmp(m_cCurIp,m_alllinechar.Hostchar[ii].HostIp)==0) { pos=ii; break; } } } switch(type) { case MAPSTATIC_UDP: { m_alllinechar.FireWallCfg.sNatCfg.us_PortNumberUdp=0; memset(m_alllinechar.FireWallCfg.sNatCfg.MapStaticUdp,0,sizeof(m_alllinechar.FireWallCfg.sNatCfg.MapStaticUdp)); for(int i=0;i<Lines;i++) { int nret=edit.GetLine(i,tempchar); if(nret==0)continue; csPort=(CString)tempchar; int len=csPort.GetLength(); csPort.Delete(nret,len-nret);//不能超过缓冲区大小 strcpy(m_alllinechar.FireWallCfg.sNatCfg.MapStaticUdp[i],csPort.GetBuffer(len)); m_alllinechar.FireWallCfg.sNatCfg.us_PortNumberUdp++; } } break; case MAPSTATIC_TCP: { m_alllinechar.FireWallCfg.sNatCfg.us_PortNumberTcp=0; memset(m_alllinechar.FireWallCfg.sNatCfg.MapStaticTcp,0,sizeof(m_alllinechar.FireWallCfg.sNatCfg.MapStaticTcp)); for(int i=0;i<Lines;i++) { int nret=edit.GetLine(i,tempchar); if(nret==0)continue; csPort=(CString)tempchar; int len=csPort.GetLength(); csPort.Delete(nret,len-nret);//不能超过缓冲区大小 strcpy(m_alllinechar.FireWallCfg.sNatCfg.MapStaticTcp[i],csPort.GetBuffer(len)); m_alllinechar.FireWallCfg.sNatCfg.us_PortNumberTcp++; } } break; case TCPSRCOUT: { m_alllinechar.Hostchar[pos].nPos[TCPSRCOUT]=0; memset(m_alllinechar.Hostchar[pos].TcpSrcOut,0,sizeof(m_alllinechar.Hostchar[pos].TcpSrcOut)); for(int i=0;i<Lines;i++) { int nret=edit.GetLine(i,tempchar); if(nret==0)continue; csPort=(CString)tempchar; int len=csPort.GetLength(); csPort.Delete(nret,len-nret);//不能超过缓冲区大小 strcpy(m_alllinechar.Hostchar[pos].TcpSrcOut[i],csPort.GetBuffer(len)); m_alllinechar.Hostchar[pos].nPos[TCPSRCOUT]++; } } break; case TCPDSTOUT: { m_alllinechar.Hostchar[pos].nPos[TCPDSTOUT]=0; memset(m_alllinechar.Hostchar[pos].TcpDstOut,0,sizeof(m_alllinechar.Hostchar[pos].TcpDstOut)); // m_alllinechar.TcpDstOut=new char[Lines][30]; for(int i=0;i<Lines;i++) { int nret=edit.GetLine(i,tempchar); if(nret==0)continue; csPort=(CString)tempchar; int len=csPort.GetLength(); csPort.Delete(nret,len-nret);//不能超过缓冲区大小 strcpy(m_alllinechar.Hostchar[pos].TcpDstOut[i],csPort.GetBuffer(len)); m_alllinechar.Hostchar[pos].nPos[TCPDSTOUT]++; } } break; case UDPSRCOUT: { m_alllinechar.Hostchar[pos].nPos[UDPSRCOUT]=0; memset(m_alllinechar.Hostchar[pos].UdpSrcOut,0,sizeof(m_alllinechar.Hostchar[pos].UdpSrcOut)); // m_alllinechar.UdpSrcOut=new char[Lines][30]; for(int i=0;i<Lines;i++) { int nret=edit.GetLine(i,tempchar); if(nret==0)continue; csPort=(CString)tempchar; int len=csPort.GetLength(); csPort.Delete(nret,len-nret);//不能超过缓冲区大小 strcpy(m_alllinechar.Hostchar[pos].UdpSrcOut[i],csPort.GetBuffer(len)); m_alllinechar.Hostchar[pos].nPos[UDPSRCOUT]++; } } break; case UDPDSTOUT: { m_alllinechar.Hostchar[pos].nPos[UDPDSTOUT]=0; memset(m_alllinechar.Hostchar[pos].UdpDstOut,0,sizeof(m_alllinechar.Hostchar[pos].UdpDstOut)); // m_alllinechar.TcpDstIn=new char[Lines][30]; for(int i=0;i<Lines;i++) { int nret=edit.GetLine(i,tempchar); if(nret==0)continue; csPort=(CString)tempchar; int len=csPort.GetLength(); csPort.Delete(nret,len-nret);//不能超过缓冲区大小 strcpy(m_alllinechar.Hostchar[pos].UdpDstOut[i],csPort.GetBuffer(len)); m_alllinechar.Hostchar[pos].nPos[UDPDSTOUT]++; } } break; case ICMPTYPEIN: { m_alllinechar.Hostchar[pos].nPos[ICMPTYPEIN]=0; memset(m_alllinechar.Hostchar[pos].IcmpTypeIn,0,sizeof(m_alllinechar.Hostchar[pos].IcmpTypeIn)); // m_alllinechar.IcmpTypeIn=new char[Lines][30]; for(int i=0;i<Lines;i++) { int nret=edit.GetLine(i,tempchar); if(nret==0)continue; csPort=(CString)tempchar; int len=csPort.GetLength(); csPort.Delete(nret,len-nret);//不能超过缓冲区大小 strcpy(m_alllinechar.Hostchar[pos].IcmpTypeIn[i],csPort.GetBuffer(len)); m_alllinechar.Hostchar[pos].nPos[ICMPTYPEIN]++; } } break; case ICMPTYPEOUT: { m_alllinechar.Hostchar[pos].nPos[ICMPTYPEOUT]=0; memset(m_alllinechar.Hostchar[pos].IcmpTypeOut,0,sizeof(m_alllinechar.Hostchar[pos].IcmpTypeOut)); // m_alllinechar.IcmpTypeOut=new char[Lines][30]; for(int i=0;i<Lines;i++) { int nret=edit.GetLine(i,tempchar); if(nret==0)continue; csPort=(CString)tempchar; int len=csPort.GetLength(); csPort.Delete(nret,len-nret);//不能超过缓冲区大小 strcpy(m_alllinechar.Hostchar[pos].IcmpTypeOut[i],csPort.GetBuffer(len)); m_alllinechar.Hostchar[pos].nPos[ICMPTYPEOUT]++; } } break; case INDM: { m_alllinechar.InDmPos=Lines; memset(m_alllinechar.InDmIpTab,0,sizeof(m_alllinechar.InDmIpTab)); // m_alllinechar.AllowIpTab=new char[Lines][30]; for(int i=0;i<Lines;i++) { int nret=edit.GetLine(i,tempchar); if(nret==0) { m_alllinechar.InDmPos--; continue; } csPort=(CString)tempchar; int len=csPort.GetLength(); csPort.Delete(nret,len-nret);//不能超过缓冲区大小 strcpy(m_alllinechar.InDmIpTab[i],csPort.GetBuffer(len)); } } break; case OUTDM: { m_alllinechar.OutDmPos=0; memset(m_alllinechar.OutDmIpTab,0,sizeof(m_alllinechar.OutDmIpTab)); // m_alllinechar.AllowIpTab=new char[Lines][30]; for(int i=0;i<Lines;i++) { int nret=edit.GetLine(i,tempchar); if(nret==0) continue; csPort=(CString)tempchar; int len=csPort.GetLength(); csPort.Delete(nret,len-nret);//不能超过缓冲区大小 strcpy(m_alllinechar.OutDmIpTab[i],csPort.GetBuffer(len)); m_alllinechar.OutDmPos++; } } break; case ALLOWIPTAB: { m_alllinechar.AllowPos=0; memset(m_alllinechar.AllowIpTab,0,sizeof(m_alllinechar.AllowIpTab)); // m_alllinechar.AllowIpTab=new char[Lines][30]; for(int i=0;i<Lines;i++) { int nret=edit.GetLine(i,tempchar); if(nret==0) continue; csPort=(CString)tempchar; int len=csPort.GetLength(); csPort.Delete(nret,len-nret);//不能超过缓冲区大小 strcpy(m_alllinechar.AllowIpTab[i],csPort.GetBuffer(len)); m_alllinechar.AllowPos++; } } break; case REJIPTAB: { m_alllinechar.RejPos=0; memset(m_alllinechar.RejIpTab,0,sizeof(m_alllinechar.RejIpTab)); // m_alllinechar.RejIpTab=new char[Lines][30]; for(int i=0;i<Lines;i++) { int nret=edit.GetLine(i,tempchar); if(nret==0) continue; csPort=(CString)tempchar; int len=csPort.GetLength(); csPort.Delete(nret,len-nret);//不能超过缓冲区大小 strcpy(m_alllinechar.RejIpTab[i],csPort.GetBuffer(len)); m_alllinechar.RejPos++; } } break; default: return; } } VOID CDataConvert::WriteToFile() { CFile myFile; myFile.Open("UserSet.txt",CFile::modeCreate|CFile::modeWrite,NULL); ULONG size=sizeof(struct AllLineChar); myFile.WriteHuge(&m_alllinechar,size); myFile.Close(); } VOID CDataConvert::ReadFromFile() { CFile myFile; if(myFile.Open("UserSet.txt",CFile::modeRead,NULL)==0) return; ULONG size=sizeof(struct AllLineChar); myFile.ReadHuge(&m_alllinechar,size); myFile.Close(); } //添加拒绝IP表和允许IP表 VOID CDataConvert::AddIpTable(UCHAR type,CEdit &edit) { // TODO: Add extra validation here BOOL bFirst=TRUE; char Ipaddr[20]; ULONG nIpaddr; char pIpaddr[30]; int IpCount=0; int Lines; //begin系统初始化时装载以前的用户设置数据,(也可以:无需!当用户重新设置后生效) switch(type) { case INITALLOWIPTAB: Lines=m_alllinechar.AllowPos; break; case INITREJIPTAB: Lines=m_alllinechar.RejPos; break; case INITINDMTAB: Lines=m_alllinechar.InDmPos; break; case INITOUTDMTAB: Lines=m_alllinechar.OutDmPos; break; case ALLOWIPTAB: while(!m_ptrlistAllowIp.IsEmpty()) { struct IpaddrRange *IpRange1=(struct IpaddrRange *)m_ptrlistAllowIp.RemoveHead(); delete IpRange1; } Lines=edit.GetLineCount(); break; case REJIPTAB: while(!m_ptrlistRejectIp.IsEmpty())//重新设定后先清空 { struct IpaddrRange *IpRange2=(struct IpaddrRange *)m_ptrlistRejectIp.RemoveHead(); delete IpRange2; } Lines=edit.GetLineCount(); break; case INDM: while(!m_listInHttp.IsEmpty()) { struct IpaddrRange *IpRange=(struct IpaddrRange *)m_ptrlistRejectIp.RemoveHead(); delete IpRange; } break; case OUTDM: while(!m_listOutHttp.IsEmpty()) { struct IpaddrRange *IpRange=(struct IpaddrRange *)m_ptrlistRejectIp.RemoveHead(); delete IpRange; } break; default: return; } //end // Lines=edit.GetLineCount(); CString csIpaddr; int nret; for(int i=0;i<Lines;i++) { csIpaddr.Empty(); memset(Ipaddr,0,20); //begin系统初始化时装载以前的用户设置数据,(也可以:无需!当用户重新设置后生效) switch(type) { case INITALLOWIPTAB: memcpy(pIpaddr,m_alllinechar.AllowIpTab[i],30); nret=strlen(pIpaddr); break; case INITREJIPTAB: memcpy(pIpaddr,m_alllinechar.RejIpTab[i],30); nret=strlen(pIpaddr); break; case INITINDMTAB: memcpy(pIpaddr,m_alllinechar.InDmIpTab[i],30); nret=strlen(pIpaddr); break; case INITOUTDMTAB: memcpy(pIpaddr,m_alllinechar.OutDmIpTab[i],30); nret=strlen(pIpaddr); break; default: { nret=edit.GetLine(i,pIpaddr); if(nret==0)continue;//空行 } } //end // int nret=edit.GetLine(i,pIpaddr); // if(nret==0)continue;//空行 csIpaddr=(CString)pIpaddr; int pos,nrem; csIpaddr.Delete(nret,29-nret);//不能超过缓冲区大小 pos=csIpaddr.Find(':'); nrem=csIpaddr.Remove(' '); struct IpaddrRange *IpRange=new struct IpaddrRange; if(pos!=-1) { CString str1; str1=csIpaddr.SpanExcluding(":"); // Ipaddr=str1.GetBuffer(str1.GetLength()); int i5=str1.GetLength(); memcpy(Ipaddr,str1.GetBuffer(i5),i5); nIpaddr=inet_addr(Ipaddr); if(nIpaddr==INADDR_NONE) { AfxMessageBox("有不正确的IP地址格式,请重新输入!"); delete IpRange; break; } CString str; int i2=nret-pos; //if() str=csIpaddr.Mid(pos-nrem+1,i2); IpRange->nIpAddr=nIpaddr; IpRange->nIpaddrNum=atoi(str.GetBuffer(i2)); // IpRange->nIpMask=;.................add } else { // IpRange->nIpMask=;.................add memcpy(Ipaddr,csIpaddr.GetBufferSetLength(nret-nrem),nret-nrem); nIpaddr=inet_addr(Ipaddr); if(nIpaddr==INADDR_NONE) { AfxMessageBox("有不正确的IP地址格式,请重新输入!"); delete IpRange; break; } IpRange->nIpAddr=nIpaddr; IpRange->nIpaddrNum=1; } switch(type) { case INITALLOWIPTAB: case ALLOWIPTAB: m_ptrlistAllowIp.AddHead(IpRange); break; case INITREJIPTAB: case REJIPTAB: m_ptrlistRejectIp.AddHead(IpRange); break; case INITINDMTAB: case INDM: m_listInHttp.AddHead(IpRange); break; case INITOUTDMTAB: case OUTDM: m_listOutHttp.AddHead(IpRange); break; } } } VOID CDataConvert:: DeleteHost(CString m_HostIp) { int nrem=m_HostIp.Remove(' '); int pos=m_HostIp.Find(':'); int i1=m_HostIp.GetLength(); BOOL bhave=FALSE; for(int i=0;i<m_alllinechar.CurHostNum;i++) { if(strcmp(m_alllinechar.Hostchar[i].HostIp,m_HostIp.GetBufferSetLength(24))==0) {//循环移位,填充删除的主机信息 int k=i; bhave=TRUE; memset((struct HostChar*)&m_alllinechar.Hostchar[i],0,sizeof(struct HostChar)); for(int j=i+1;j<m_alllinechar.CurHostNum;j++) { memcpy((struct HostChar*)&m_alllinechar.Hostchar[k],(struct HostChar*)&m_alllinechar.Hostchar[j],sizeof(struct HostChar)); k++; memset((struct HostChar*)&m_alllinechar.Hostchar[k],0,sizeof(struct HostChar)); } m_alllinechar.CurHostNum--; // break; } } //删除链表中的对应项 if(bhave) { struct HostList* phostlist; int nIp; if(pos!=-1) { CString str1; str1=m_HostIp.SpanExcluding(":"); nIp=inet_addr(str1.GetBuffer(str1.GetLength())); if(nIp==INADDR_NONE) { AfxMessageBox("有不正确的IP地址格式,请重新输入!"); return; } POSITION pos,curpos; pos=m_ptrlistHostPort.GetHeadPosition(); while(pos!=NULL) { curpos=pos; phostlist=(struct HostList*)m_ptrlistHostPort.GetNext(pos); if(phostlist->sIpRange.nIpAddr==nIp) {//所有的端口列表在退出时删除 m_ptrlistHostPort.RemoveAt(curpos); delete phostlist; break; } } } else { nIp=inet_addr(m_HostIp.GetBuffer(i1)); if(nIp==INADDR_NONE) { AfxMessageBox("有不正确的IP地址格式,请重新输入!"); return; } POSITION pos,curpos; pos=m_ptrlistHostPort.GetHeadPosition(); while(pos!=NULL) { curpos=pos; phostlist=(struct HostList*)m_ptrlistHostPort.GetNext(pos); if(phostlist->sIpRange.nIpAddr==nIp) { m_ptrlistHostPort.RemoveAt(curpos); delete phostlist; break; } } } } } //设定主机IP或IP范围;决定了SetPortList()函数中的端口列表 //如果bhaved为TRUE,则取得具体的主机;以让用户修改主机的所有信息 //调用函数中无需对phost分配空间 VOID CDataConvert::SetHostIp(CString m_HostIp,BOOL &bhaved,struct HostChar *phostchar) { //初始化,有效的区分tcp,udp与ftp,http,telnet对端口的相应设置 bhaved=FALSE; int nrem=m_HostIp.Remove(' '); int pos=m_HostIp.Find(':'); int i1=m_HostIp.GetLength(); BOOL bhave=FALSE; memset(m_cCurIp,0,24); strcpy(m_cCurIp,m_HostIp.GetBufferSetLength(24)); struct HostList *pHostList; for(int i=0;i<m_alllinechar.CurHostNum;i++) { if(strcmp(m_alllinechar.Hostchar[i].HostIp,m_HostIp.GetBufferSetLength(24))==0) { bhave=TRUE; bhaved=TRUE; memcpy(phostchar,(struct HostChar*)&m_alllinechar.Hostchar[i],sizeof(struct HostChar)); break; } } if(!bhave) { strcpy(m_alllinechar.Hostchar[i].HostIp,m_HostIp.GetBufferSetLength(24)); m_alllinechar.CurHostNum++; } if(pos!=-1) { CString str1; str1=m_HostIp.SpanExcluding(":"); int nIp=inet_addr(str1.GetBuffer(str1.GetLength())); if(nIp==INADDR_NONE) { AfxMessageBox("有不正确的IP地址格式,请重新输入!"); return; } CString str; int i2=i1-pos; str=m_HostIp.Mid(pos+1,i2); m_CurIp=nIp; if(!bhave) { pHostList=new struct HostList; pHostList->sIpRange.nIpAddr=nIp; pHostList->sIpRange.nIpaddrNum=atoi(str.GetBuffer(i2)); } } else { int nIp1=inet_addr(m_HostIp.GetBuffer(i1)); if(nIp1==INADDR_NONE) { AfxMessageBox("有不正确的IP地址格式,请重新输入!"); return; } m_CurIp=nIp1; //当第一次配置以后,如果设定的主机已经配置,则直接修改链表 if(!bhave) { pHostList=new struct HostList; pHostList->sIpRange.nIpAddr=nIp1; pHostList->sIpRange.nIpaddrNum=1; } } if(!bhave) m_ptrlistHostPort.AddHead(pHostList); } VOID CDataConvert::SetPortList(CEdit &edit,USHORT type) { char port[20]; BOOL bFirst=TRUE; int Lines=edit.GetLineCount(); CString csPort; struct HostList *pHostList;//先取出链表中的对应项;借此添加端口列表到链表的对应项 //先取出链表中的对应项; POSITION pos; pos=m_ptrlistHostPort.GetHeadPosition(); while(pos!=NULL) { pHostList=(struct HostList*)m_ptrlistHostPort.GetNext(pos); if(pHostList->sIpRange.nIpAddr==m_CurIp) break; } //清空先前配置 switch(type) { //begin:拒绝的ICMP类型设定 case ICMPTYPEIN: { while(!m_ptrlistIcmp.IsEmpty()) { struct IcmpList *icmprange=(struct IcmpList *)m_ptrlistIcmp.RemoveHead(); delete icmprange; } } break; case ICMPTYPEOUT: { while(!m_ptrlistIcmpOut.IsEmpty()) { struct IcmpList *icmprange=(struct IcmpList *)m_ptrlistIcmpOut.RemoveHead(); delete icmprange; } } break; //end:拒绝的ICMP类型设定 //begin:允许TCP端口设定 case TCPSRCOUT: { while(!pHostList->sTcpPortSet.sAllowOutSrcPortList.IsEmpty()) { struct PortList *pportlist=(struct PortList *)pHostList->sTcpPortSet.sAllowOutSrcPortList.RemoveHead(); delete pportlist; } } break; case TCPDSTOUT: { while(!pHostList->sTcpPortSet.sAllowOutDstPortList.IsEmpty()) { struct PortList *pportlist=(struct PortList *)pHostList->sTcpPortSet.sAllowOutDstPortList.RemoveHead(); delete pportlist; } } break; //end:允许的TCP端口设定 //begin:允许的udp端口设定 case UDPSRCOUT: { while(!pHostList->sTcpPortSet.sAllowOutSrcPortList.IsEmpty()) { struct PortList *pportlist=(struct PortList *)pHostList->sTcpPortSet.sAllowOutSrcPortList.RemoveHead(); delete pportlist; } } break; case UDPDSTOUT: { while(!pHostList->sTcpPortSet.sAllowOutDstPortList.IsEmpty()) { struct PortList *pportlist=(struct PortList *)pHostList->sTcpPortSet.sAllowOutDstPortList.RemoveHead(); delete pportlist; } } break; //end:允许的udp端口设定 default: return; } for(int i=0;i<Lines;i++) { csPort.Empty(); //memset(port,0,20); //memset(pIpaddr,0,30); int nret=edit.GetLine(i,port); if(nret==0)continue;//空行 csPort=(CString)port; csPort.Delete(nret,csPort.GetLength()-nret);//不能超过缓冲区大小 int pos=csPort.Find(':'); int nrem=csPort.Remove(' '); //m_ptrlistPort有利于内存回收 // struct HostList *pHostList;//先取出链表中的对应项;借此添加端口列表到链表的对应项 if(pos!=-1) {//端口用范围表示法 CString str1; str1=csPort.SpanExcluding(":"); CString str; int i2=nret-pos; str=csPort.Mid(pos-nrem+1,i2); USHORT portbegin=atoi(str1.GetBuffer(pos)); USHORT portend=atoi(str.GetBuffer(i2)); /* //先取出链表中的对应项; POSITION pos; pos=m_ptrlistHostPort.GetHeadPosition(); while(pos!=NULL) { pHostList=(struct HostList*)m_ptrlistHostPort.GetNext(pos); if(pHostList->sIpRange.nIpAddr==m_CurIp) break; } */ switch(type) { //begin:拒绝的ICMP类型设定 case ICMPTYPEIN: { struct IcmpList *picmplist=new struct IcmpList; picmplist->bRange=TRUE; picmplist->sIcmpRange.nIcmpBegin=portbegin; picmplist->sIcmpRange.nIcmpEnd=portend; m_ptrlistIcmp.AddHead(picmplist);//注意:m_ptrlistIcmp只是为了删除空间 pHostList->sInIcmpSet.AddHead(picmplist); } break; case ICMPTYPEOUT: { struct IcmpList *picmplist=new struct IcmpList; picmplist->bRange=TRUE; picmplist->sIcmpRange.nIcmpBegin=portbegin; picmplist->sIcmpRange.nIcmpEnd=portend; m_ptrlistIcmpOut.AddHead(picmplist);//注意:m_ptrlistIcmp只是为了删除空间 pHostList->sOutIcmpSet.AddHead(picmplist); } break; //end:拒绝的ICMP类型设定 //begin:允许TCP端口设定 case TCPSRCOUT: { struct PortList *pportlist=new struct PortList; pportlist->bRange=TRUE; pportlist->sPortRange.nPortBegin=portbegin; pportlist->sPortRange.nPortEnd=portend; pHostList->sTcpPortSet.sAllowOutSrcPortList.AddHead(pportlist); m_ptrlistPort.AddHead(pportlist);//注意:m_ptrlistPort只是为了删除空间 } break; case TCPDSTOUT: { struct PortList *pportlist=new struct PortList; pportlist->bRange=TRUE; pportlist->sPortRange.nPortBegin=portbegin; pportlist->sPortRange.nPortEnd=portend; pHostList->sTcpPortSet.sAllowOutDstPortList.AddHead(pportlist); m_ptrlistPort.AddHead(pportlist);//注意:m_ptrlistPort只是为了删除空间 } break; //end:允许的TCP端口设定 //begin:允许的udp端口设定 case UDPSRCOUT: { struct PortList *pportlist=new struct PortList; pportlist->bRange=TRUE; pportlist->sPortRange.nPortBegin=portbegin; pportlist->sPortRange.nPortEnd=portend; pHostList->sUdpPortSet.sAllowOutSrcPortList.AddHead(pportlist); m_ptrlistPort.AddHead(pportlist);//注意:m_ptrlistPort只是为了删除空间 } break; case UDPDSTOUT: { struct PortList *pportlist=new struct PortList; pportlist->bRange=TRUE; pportlist->sPortRange.nPortBegin=portbegin; pportlist->sPortRange.nPortEnd=portend; pHostList->sUdpPortSet.sAllowOutDstPortList.AddHead(pportlist); m_ptrlistPort.AddHead(pportlist);//注意:m_ptrlistPort只是为了删除空间 } break; //end:允许的udp端口设定 default: return; } } else//具体的端口表示法 { /* POSITION pos; pos=m_ptrlistHostPort.GetHeadPosition(); while(pos!=NULL) { pHostList=(struct HostList*)m_ptrlistHostPort.GetNext(pos); if(pHostList->sIpRange.nIpAddr==m_CurIp) break; } */ USHORT portbegin=atoi(csPort.GetBufferSetLength(nret-nrem)); switch(type) { case ICMPTYPEIN: { struct IcmpList *picmplist=new struct IcmpList; picmplist->bRange=FALSE; picmplist->nIcmpType=portbegin; m_ptrlistIcmp.AddHead(picmplist); pHostList->sInIcmpSet.AddHead(picmplist); } break; case ICMPTYPEOUT: { struct IcmpList *picmplist=new struct IcmpList; picmplist->bRange=FALSE; picmplist->nIcmpType=portbegin; m_ptrlistIcmpOut.AddHead(picmplist); pHostList->sOutIcmpSet.AddHead(picmplist); } break; case TCPSRCOUT: { struct PortList *pportlist=new struct PortList; pportlist->bRange=FALSE; pportlist->nPort=portbegin; m_ptrlistPort.AddHead(pportlist); pHostList->sTcpPortSet.sAllowOutSrcPortList.AddHead(pportlist); } break; case TCPDSTOUT: { struct PortList *pportlist=new struct PortList; pportlist->bRange=FALSE; pportlist->nPort=portbegin; m_ptrlistPort.AddHead(pportlist); pHostList->sTcpPortSet.sAllowOutDstPortList.AddHead(pportlist); } break; case UDPSRCOUT: { struct PortList *pportlist=new struct PortList; pportlist->bRange=FALSE; pportlist->nPort=portbegin; m_ptrlistPort.AddHead(pportlist); pHostList->sUdpPortSet.sAllowOutSrcPortList.AddHead(pportlist); } break; case UDPDSTOUT: { struct PortList *pportlist=new struct PortList; pportlist->bRange=FALSE; pportlist->nPort=portbegin; m_ptrlistPort.AddHead(pportlist); pHostList->sUdpPortSet.sAllowOutDstPortList.AddHead(pportlist); } break; default: return; } } bFirst=FALSE; } } //填充NAT配置信息,注意:分配的空间尚未释放 VOID CDataConvert::SetNatCfg(struct NAT_Cfg *natcfg) { natcfg->nGlobalAddress=m_firewallconfig.nOutsideIp; natcfg->us_HighPort=m_alllinechar.FireWallCfg.sNatCfg.nHighPort; natcfg->us_LowPort=m_alllinechar.FireWallCfg.sNatCfg.nLowPort; natcfg->us_MaxNatNumber=m_alllinechar.FireWallCfg.sNatCfg.nMaxNatNumber; natcfg->nTimeOut_TCP=m_alllinechar.FireWallCfg.sNatCfg.nTimeOut_TCP; natcfg->nTimeOut_UDP=m_alllinechar.FireWallCfg.sNatCfg.nTimeOut_UDP; //静态端口NAT映射 int tcpnum=m_alllinechar.FireWallCfg.sNatCfg.us_PortNumberTcp; int udpnum=m_alllinechar.FireWallCfg.sNatCfg.us_PortNumberUdp; int itemnum=0; natcfg->StaticTable.count=tcpnum+udpnum; natcfg->StaticTable.item=new struct STATICTABLEITEM[natcfg->StaticTable.count]; for(int i=0;i<tcpnum;i++) { natcfg->StaticTable.item[itemnum].type=1;//tcp ConvertEditChar(m_alllinechar.FireWallCfg.sNatCfg.MapStaticTcp[i],natcfg->StaticTable.item[itemnum].ulIpadress, natcfg->StaticTable.item[itemnum].usPort,TRUE); itemnum++; } for(int j=0;j<udpnum;j++) { natcfg->StaticTable.item[itemnum].type=2;//udp ConvertEditChar(m_alllinechar.FireWallCfg.sNatCfg.MapStaticUdp[j],natcfg->StaticTable.item[itemnum].ulIpadress, natcfg->StaticTable.item[itemnum].usPort,TRUE); itemnum++; } } VOID CDataConvert::InitFireWall() { //begin初始化全局标志 globalFlags=m_alllinechar.sGlobalFlags; //end初始化全局标志 m_firewallconfig.nIntraIp=inet_addr(m_alllinechar.FireWallCfg.csIntraIp); m_firewallconfig.nIntraMask=inet_addr(m_alllinechar.FireWallCfg.csIntraMask); m_firewallconfig.nMiddleIp=inet_addr(m_alllinechar.FireWallCfg.csMiddleIp); m_firewallconfig.nMiddleMask=inet_addr(m_alllinechar.FireWallCfg.csMiddleMask); m_firewallconfig.nOutsideIp=inet_addr(m_alllinechar.FireWallCfg.csOutsideIp); m_firewallconfig.nOutsideMask=inet_addr(m_alllinechar.FireWallCfg.csOutsideMask); // memcpy(&m_firewallconfig.sFilterdrvCfg,&m_alllinechar.FireWallCfg.sFilterdrvCfg,sizeof(struct Filterdrv_Cfg)); } VOID CDataConvert::ConvertEditChar(char *pchar,ULONG &mylong,USHORT &mynum,BOOL bIp) { CString csPort; csPort=(CString)pchar; int nrem=csPort.Remove(' '); int pos=csPort.Find(':'); CString str1; if(pos!=-1) {//端口用范围表示法 str1=csPort.SpanExcluding(":"); CString str; int i2=csPort.GetLength()-pos+1; str=csPort.Mid(pos+1,i2); if(bIp)//是IP { mylong=inet_addr(str1.GetBuffer(str1.GetLength())); mynum=atoi(str.GetBuffer(i2)); } else//是端口 { mylong=atoi(str1.GetBuffer(str1.GetLength())); mynum=atoi(str.GetBuffer(i2)); } } else { if(bIp)//是IP { mylong=inet_addr(pchar); mynum=1; } else//是端口 { mylong=atoi(pchar); mynum=1; } /* char tempchar[30]; unsigned char*uchar=(unsigned char*)pchar; int len=strlen((const char *)pchar); int i=0; for(i;i<30;i++) { if(uchar[i]!=0xCC) { tempchar[i]=uchar[i]; } else break; } tempchar[i]=0x0; if(bIp)//是IP { mylong=inet_addr(tempchar); mynum=1; } else//是端口 { mylong=atoi(tempchar); mynum=1; } */ } } VOID CDataConvert::DisplayHost(struct HostChar *phostchar,USHORT type,CEdit &edit) { int len=phostchar->nPos[type]; CString *str=new CString[len]; CString tstr; for(int i=0;i<len;i++) { switch(type) { case TCPSRCOUT: str[i]=(CString)phostchar->TcpSrcOut[i]; break; case TCPDSTOUT: str[i]=(CString)phostchar->TcpDstOut[i]; break; case UDPSRCOUT: str[i]=(CString)phostchar->UdpSrcOut[i]; break; case UDPDSTOUT: str[i]=(CString)phostchar->UdpDstOut[i]; break; case ICMPTYPEIN: str[i]=(CString)phostchar->IcmpTypeIn[i]; break; case ICMPTYPEOUT: str[i]=(CString)phostchar->IcmpTypeOut[i]; break; default: { delete []str; return; } } str[i]+="\r\n"; tstr+=str[i]; } edit.SetWindowText(tstr.GetBuffer(tstr.GetLength())); delete []str; } /* VOID CDataConvert::ConvertToStr(char *pchar,CString &str,int nret,int &strlen,CEdit *edit) { str=(CString)tempchar; int strlen=str.GetLength(); str.Delete(nret,strlen-nret);//不能超过缓冲区大小 } */ VOID CDataConvert::DisplayFireCfg(CEdit &edit,USHORT type) { int num; switch(type) { case ALLOWIPTAB: num=m_alllinechar.AllowPos; break; case REJIPTAB: num=m_alllinechar.RejPos; break; case MAPSTATIC_UDP: num=m_alllinechar.FireWallCfg.sNatCfg.us_PortNumberUdp; break; case MAPSTATIC_TCP: num=m_alllinechar.FireWallCfg.sNatCfg.us_PortNumberTcp; break; case INDM: num=m_alllinechar.InDmPos; break; case OUTDM: num=m_alllinechar.OutDmPos; break; } if(num>=0) { CString *str=new CString[num]; CString tstr; for(int i=0;i<num;i++) { switch(type) { case ALLOWIPTAB: str[i]=(CString)m_alllinechar.AllowIpTab[i]; break; case REJIPTAB: str[i]=(CString)m_alllinechar.RejIpTab[i]; break; case MAPSTATIC_UDP: str[i]=(CString)m_alllinechar.FireWallCfg.sNatCfg.MapStaticUdp[i]; break; case MAPSTATIC_TCP: str[i]=(CString)m_alllinechar.FireWallCfg.sNatCfg.MapStaticTcp[i]; break; case INDM: str[i]=(CString)m_alllinechar.InDmIpTab[i]; break; case OUTDM: str[i]=(CString)m_alllinechar.OutDmIpTab[i]; break; } str[i]+="\r\n"; tstr+=str[i]; edit.SetWindowText(tstr.GetBuffer(tstr.GetLength())); } delete []str; } } VOID CDataConvert::InitPortList(USHORT type,int &ii,struct HostList *pHostList) { int Lines; switch(type) { case TCPSRCOUT: Lines=m_alllinechar.Hostchar[ii].nPos[TCPSRCOUT]; break; case TCPDSTOUT: Lines=m_alllinechar.Hostchar[ii].nPos[TCPDSTOUT]; break; case UDPSRCOUT: Lines=m_alllinechar.Hostchar[ii].nPos[UDPSRCOUT]; break; case UDPDSTOUT: Lines=m_alllinechar.Hostchar[ii].nPos[UDPDSTOUT]; break; case ICMPTYPEIN: Lines=m_alllinechar.Hostchar[ii].nPos[ICMPTYPEIN]; break; case ICMPTYPEOUT: Lines=m_alllinechar.Hostchar[ii].nPos[ICMPTYPEOUT]; break; default: return; } ULONG portbegin; USHORT portend; for(int i=0;i<Lines;i++)// jl1222 { switch(type) { case TCPSRCOUT: ConvertEditChar(m_alllinechar.Hostchar[ii].TcpSrcOut[i],portbegin,portend,FALSE); break; case TCPDSTOUT: ConvertEditChar(m_alllinechar.Hostchar[ii].TcpDstOut[i],portbegin,portend,FALSE); break; case UDPSRCOUT: ConvertEditChar(m_alllinechar.Hostchar[ii].UdpSrcOut[i],portbegin,portend,FALSE); break; case UDPDSTOUT: ConvertEditChar(m_alllinechar.Hostchar[ii].UdpDstOut[i],portbegin,portend,FALSE); break; case ICMPTYPEIN: ConvertEditChar(m_alllinechar.Hostchar[ii].IcmpTypeIn[i],portbegin,portend,FALSE); break; case ICMPTYPEOUT: ConvertEditChar(m_alllinechar.Hostchar[ii].IcmpTypeOut[i],portbegin,portend,FALSE); break; default: return; } if(portend>1)//范围表示法 { switch(type) { //begin:拒绝的ICMP类型设定 case ICMPTYPEIN: { struct IcmpList *picmplist=new struct IcmpList; picmplist->bRange=TRUE; picmplist->sIcmpRange.nIcmpBegin=portbegin; picmplist->sIcmpRange.nIcmpEnd=portend; m_ptrlistIcmp.AddHead(picmplist);//注意:m_ptrlistIcmp只是为了删除空间 pHostList->sInIcmpSet.AddHead(picmplist); } break; case ICMPTYPEOUT: { struct IcmpList *picmplist=new struct IcmpList; picmplist->bRange=TRUE; picmplist->sIcmpRange.nIcmpBegin=portbegin; picmplist->sIcmpRange.nIcmpEnd=portend; m_ptrlistIcmpOut.AddHead(picmplist);//注意:m_ptrlistIcmp只是为了删除空间 pHostList->sOutIcmpSet.AddHead(picmplist); } break; //end:拒绝的ICMP类型设定 //begin:允许TCP端口设定 case TCPSRCOUT: { struct PortList *pportlist=new struct PortList; pportlist->bRange=TRUE; pportlist->sPortRange.nPortBegin=portbegin; pportlist->sPortRange.nPortEnd=portend; pHostList->sTcpPortSet.sAllowOutSrcPortList.AddHead(pportlist); m_ptrlistPort.AddHead(pportlist);//注意:m_ptrlistPort只是为了删除空间 } break; case TCPDSTOUT: { struct PortList *pportlist=new struct PortList; pportlist->bRange=TRUE; pportlist->sPortRange.nPortBegin=portbegin; pportlist->sPortRange.nPortEnd=portend; pHostList->sTcpPortSet.sAllowOutDstPortList.AddHead(pportlist); m_ptrlistPort.AddHead(pportlist);//注意:m_ptrlistPort只是为了删除空间 } break; //end:允许的TCP端口设定 //begin:允许的udp端口设定 case UDPSRCOUT: { struct PortList *pportlist=new struct PortList; pportlist->bRange=TRUE; pportlist->sPortRange.nPortBegin=portbegin; pportlist->sPortRange.nPortEnd=portend; pHostList->sUdpPortSet.sAllowOutSrcPortList.AddHead(pportlist); m_ptrlistPort.AddHead(pportlist);//注意:m_ptrlistPort只是为了删除空间 } break; case UDPDSTOUT: { struct PortList *pportlist=new struct PortList; pportlist->bRange=TRUE; pportlist->sPortRange.nPortBegin=portbegin; pportlist->sPortRange.nPortEnd=portend; pHostList->sUdpPortSet.sAllowOutDstPortList.AddHead(pportlist); m_ptrlistPort.AddHead(pportlist);//注意:m_ptrlistPort只是为了删除空间 } break; //end:允许的udp端口设定 default: return; } } else//具体的端口表示法 { switch(type) { case ICMPTYPEIN: { struct IcmpList *picmplist=new struct IcmpList; picmplist->bRange=FALSE; picmplist->nIcmpType=portbegin; m_ptrlistIcmp.AddHead(picmplist); pHostList->sInIcmpSet.AddHead(picmplist); } break; case ICMPTYPEOUT: { struct IcmpList *picmplist=new struct IcmpList; picmplist->bRange=FALSE; picmplist->nIcmpType=portbegin; m_ptrlistIcmpOut.AddHead(picmplist); pHostList->sOutIcmpSet.AddHead(picmplist); } break; case TCPSRCOUT: { struct PortList *pportlist=new struct PortList; pportlist->bRange=FALSE; pportlist->nPort=portbegin; m_ptrlistPort.AddHead(pportlist); pHostList->sTcpPortSet.sAllowOutSrcPortList.AddHead(pportlist); } break; case TCPDSTOUT: { struct PortList *pportlist=new struct PortList; pportlist->bRange=FALSE; pportlist->nPort=portbegin; m_ptrlistPort.AddHead(pportlist); pHostList->sTcpPortSet.sAllowOutDstPortList.AddHead(pportlist); } break; case UDPSRCOUT: { struct PortList *pportlist=new struct PortList; pportlist->bRange=FALSE; pportlist->nPort=portbegin; m_ptrlistPort.AddHead(pportlist); pHostList->sUdpPortSet.sAllowOutSrcPortList.AddHead(pportlist); } break; case UDPDSTOUT: { struct PortList *pportlist=new struct PortList; pportlist->bRange=FALSE; pportlist->nPort=portbegin; m_ptrlistPort.AddHead(pportlist); pHostList->sUdpPortSet.sAllowOutDstPortList.AddHead(pportlist); } break; default: return; } } } } VOID CDataConvert::InitHostList() { for(int ii=0;ii<m_alllinechar.CurHostNum;ii++)// jl1222 { struct HostList *phostlist=new struct HostList ; for(int i=0;i<6;i++)//i:对应于宏定义 { InitPortList(i,ii,phostlist); } ULONG hostip; USHORT ipnum; ConvertEditChar(m_alllinechar.Hostchar[ii].HostIp,hostip,ipnum,TRUE); phostlist->sIpRange.nIpAddr=hostip; phostlist->sIpRange.nIpaddrNum=ipnum; m_ptrlistHostPort.AddHead(phostlist); } }